/**
 * [565] 数组嵌套
 * # 每个元素视作一个节点
 * # 元素索引为入，元素值为出，每个节点只对应 1 入 1 出
 * # 这将导致随意一个节点开始终将形成一个环
 * # 且当环的长度超过数组长度一半时，不会再出现任何比它更长的环
 * @format
 * @lc app=leetcode.cn id=565 lang=javascript
 */

// @lc code=start
/**
 * @param {number[]} nums
 * @return {number}
 */
var arrayNesting = function (nums) {
    let result = 0
    // const traversed = Array(nums.length).fill(false)
    for (let i = 0; i < nums.length; i++) {
        // if (traversed[i]) continue
        // if (nums[i] === nums.length) continue
        let count = 0
        // let j = i
        while (nums[i] != nums.length) {
            const temp = nums[i]
            nums[i] = nums.length
            count++
            i = temp
        }
        count > result ? (result = count) : null
        if (count > nums.length / 2) break
    }
    return result
}

// var arrayNesting = function (nums) {
//     let k = 0
//     const sets = {}
//     const indexes = {}
//     for (let i = 0; i < nums.length; i++) {
//         if (indexes[i]) continue
//         else {
//             sets[i] = {}
//             sets[i].length = 0
//             let j = i
//             while (!sets[i][nums[j]]) {
//                 indexes[j] = true
//                 sets[i][nums[j]] = true
//                 sets[i].length++
//                 j = nums[j]
//             }
//             if (sets[i].length > sets[k].length) k = i
//         }
//     }
//     return sets[k].length
// }
// @lc code=end

// debugger
// console.log(arrayNesting([5, 4, 0, 3, 1, 6, 2]))
